Process structure

Context switching
프로세스가 바뀔 때의 메커니즘을 컨텍스트 스위칭이라고 부른다.
Process struct deep dive
- text(code): 코드(컴파일된 소스코드 저장)
- data: 변수/초기화된 데이터
- stack: 임시 데이터(함수 호출, 로컬 변수)
- heap: 코드에서 동적으로 만들어지는 데이터

지역변수 stack
초기화된 전역변수, 정적변수 data
초기화 되지 않은 전역변수, 정적변수 bss        // bss 영역은 코드가 실행될 때 자동으로 0으로 초기화
What decides which structure a process has in memory? - Stack Overflow
code, data, heap, stack

ex) c언어 compile (정확한 동작은 아님!!)
void meaningless(int data){
int temp;
temp=data;
}
int main(int arqc, char **argv){
meaningless(1);
return 0;
}
stack:
return address:0006h(PC-0006h변경이후 pop6)
argc(pop5)
argv(pop4)
return address:0005h(PC-0005h변경이후 pop3)
data=1(pop2)
temp=1(pop1)

heap:

data:

code:
void meaningless(int data){    //0000h
int temp;        //0001h
temp=data;        //0002h
}
int main(int argc, char** argv){        //0003h
meaningless(1);        //0004h
return 0;        //0005h
}

        //0006h    - main 함수 이후 처리 코드 존재
PC(Program Counter)+SP(Stack Pointer)
PC: Code에서 현재 실행중인 코드를 가르킨다.
SP: Stack에서 가장 최상단(최소)-1 주소값을 가르킨다.
    EBP, EAX 레지스터와 같이 동작
    (EBP는 Stack을 동작시킬 때, SP를 기록 , EBP를 현재의 SP로 덮어씌우기 전에 stack에 현재 EBP 기록)
    함수의 return 값은 EAX에 저장
#include <stdio.h>
#include <stdlib.h>
int main(){
int* data;
data=(int*)malloc(sizeof(int));
*data=1;
printf("%d\n",*data);
return 0;
}
stack:
ret:0006h
data=1000h

heap:
32bit(0-trash value)->1(int)       //1000h-32bit의 공간이 생성

data:

code:
int main(){        //0000h
int* data;        //0001h
data=(int*)malloc(sizeof(int));        //0002h-동적 메모리 할당->heap(32bit)
*data=1;        //0003h
printf(“%d\n”, *data);        //0004h
return 0;        //0005h
}
        //0006h
컴파일러가 내부적으로 만든 실행파일에서는 _start() 라이브러리 내에서 main() 함수를 호출해서 main 함수를 실행한다.
main함수가 끝난후에도 프로세스 종료 처리 함수들이 존재한다.
Data segment는 BSS와 DATA로 분리
BSS: 초기화 되지 않은 전역변수
DATA: 초기화된 전역변수
int global_data1; // bss segment
int global_data2=1; // data segment
int main(){
int* data; // stack segment
data=(int*)malloc(sizeof(int)); // heap segment
*data=1;
printf("%d\n", *data);
return 0;
}
참고)
스택 오버플로우: 주로 해커들의 공격에 활용되었음
void copy(char* bar)
{
char data[6];
strcpy(data, bar);
}
int main(int argc, char** argv){
copy(argv[1]);
}
위와 같이 6바이트의 data[6]에 argv로 8바이트 크기의 문자를 대입하고 이 때, 마지막 argv[1][8]을
침투하고 싶은 메모리 주소로 적을 시, return 주소를 조작할 수 있다. -> 슈퍼 관리자 권한 획득을 통해 침투